
#include "c3_main.h"
#include "zhongduan.h"

#include <inttypes.h>
#include <string.h>
static uint16_t kaiShiShi = 0;      // 中断启用开始时间(时)
static uint16_t jieShuShi = 23;     // 中断启用结束时间(时)
static uint16_t kaiShiFen = 0;      // 中断启用开始时间(分)
static uint16_t jieShuFen = 59;     // 中断启用结束时间(分)
static bool shiJianTongBuB = false; // 时间同步标志

static const char *TAG = "zhongduan: ";
#define GPIO_INPUT_PIN 7

#define GPIO_OUTPUT_IO_0 18
#define GPIO_OUTPUT_IO_1 19
#define GPIO_OUTPUT_PIN_SEL ((1ULL << GPIO_OUTPUT_IO_0) | (1ULL << GPIO_OUTPUT_IO_1))
/*
 * Let's say, GPIO_OUTPUT_IO_0=18, GPIO_OUTPUT_IO_1=19
 * In binary representation,
 * 1ULL<<GPIO_OUTPUT_IO_0 is equal to 0000000000000000000001000000000000000000 and
 * 1ULL<<GPIO_OUTPUT_IO_1 is equal to 0000000000000000000010000000000000000000
 * GPIO_OUTPUT_PIN_SEL                0000000000000000000011000000000000000000
 * */
#define GPIO_INPUT_IO_0 4
#define GPIO_INPUT_IO_1 5
#define GPIO_INPUT_IO_2 6
//#define GPIO_INPUT_PIN_SEL ((1ULL << GPIO_INPUT_IO_0) | (1ULL << GPIO_INPUT_IO_1))
#define GPIO_INPUT_PIN_SEL ((1ULL << GPIO_INPUT_IO_0) | (1ULL << GPIO_INPUT_IO_1)| (1ULL << GPIO_INPUT_IO_2))
/*
 * Let's say, GPIO_INPUT_IO_0=4, GPIO_INPUT_IO_1=5
 * In binary representation,
 * 1ULL<<GPIO_INPUT_IO_0 is equal to 0000000000000000000000000000000000010000 and
 * 1ULL<<GPIO_INPUT_IO_1 is equal to 0000000000000000000000000000000000100000
 * GPIO_INPUT_PIN_SEL                0000000000000000000000000000000000110000
 * */
#define ESP_INTR_FLAG_DEFAULT 0
#define DEBOUNCE_TIME_MS 200 // 设置去抖时间
static volatile TickType_t last_interrupt_time = 0;

static QueueHandle_t gpio_evt_queue = NULL;
static volatile bool pd = true;

static void IRAM_ATTR gpio_isr_handler(void *arg)
{
    uint32_t gpio_num = (uint32_t)arg;//传递发生中断的IO口
    if(pd)
    {
        pd =false;
        xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
    }
}
static void gpio_task_example(void *arg)
{
    esp_err_t a=2;
    //a= esp_task_wdt_deinit();
    if (ESP_OK == a)
    {
        printf("ok.............\n");
    }
    uint32_t lx =0;
    uint16_t zheng=0;
    uint16_t fan=0;
    int16_t jishu=0;
    bool pdZ =false;
    bool pdF =false;
    for (;;)
    {
        if (xQueueReceive(gpio_evt_queue, &lx, portMAX_DELAY))
        {
            if (lx == 4)
            { 
                pd =true;
                zheng++;
                jishu++;
                printf("zhang:%d\n",zheng);
                printf("jishu:%d\n",jishu);
            }else if (lx == 5)
            { 
                pd =true;
                fan++;
                jishu--;
                printf("fan:%d\n",fan);
                printf("jishu:%d\n",jishu);
            }
            else if (lx == 6)
            { 
                pd =true;
                zheng=0;
                fan=0;
                jishu=0;
                printf("qing ling\n");
            }
        }
        vTaskDelay(pdMS_TO_TICKS(200)); // 重置任务看门狗
    }
}

// 中断初始化,参数1:IO口编号
void zhong_duan_init()
{
    // 对配置结构进行零初始化.
    gpio_config_t io_conf = {};
    // 上升沿中断
    io_conf.intr_type = GPIO_INTR_NEGEDGE;
    // 引脚的位掩码，此处使用 GPIO4/5
    io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;
    // 设置为输入模式
    io_conf.mode = GPIO_MODE_INPUT;
    // 使能上拉模式
    io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
    //io_conf.pull_down_en = GPIO_PULLDOWN_ENABLE;
    gpio_config(&io_conf);

    // 创建一个队列来处理来自 isr 的 gpio 事件
    gpio_evt_queue = xQueueCreate(1, sizeof(uint32_t));
    // 启动GPIO任务
    xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 14, NULL);

    // 安装gpio isr服务
    gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
    // 针对特定 GPIO 引脚的钩子 isr 处理程序
    gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void *)GPIO_INPUT_IO_0);
    // 针对特定 GPIO 引脚的钩子 isr 处理程序
    gpio_isr_handler_add(GPIO_INPUT_IO_1, gpio_isr_handler, (void *)GPIO_INPUT_IO_1);
    gpio_isr_handler_add(GPIO_INPUT_IO_2, gpio_isr_handler, (void *)GPIO_INPUT_IO_2);

    // 删除 GPIO 编号的 isr 处理程序.
    // gpio_isr_handler_remove(GPIO_INPUT_IO_0);
    // 再次挂钩特定 GPIO 引脚的 isr 处理程序
    // gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void *)GPIO_INPUT_IO_0);
}

